package study.top.mydb;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;




import study.top.common.DBHandler;
import study.top.common.DateTime;
import study.top.common.TopCommon;
import study.top.common.XmlParser;
import study.top.jsp.MultipartBox.FileInfo;
import study.top.jsp.PageHandler;
import study.top.mydb.items.ProductAllItem;
import study.top.mydb.items.ProductItem;
import study.top.common.HttpHandler;

public class Product {
	static Logger logger = Logger.getLogger(Product.class);
	
	private static final String TABLE = "product";
	
	String datetime = DateTime.getInstance().getNowDateTimeString();
	
	// 데이터베이스 제어 객체에 대한 참조
	DBHandler db = null;

	public Product() {
		// DB 객체에 대한 참조 연결
		db = DBHandler.getInstance();
	}
	/**
	 * 상품을 추가하는 메서드
	 * @param docid 상품코드
	 * @param title 상품 이름
	 * @param description 상품 정보
	 * @param price_min 상품 최저가격
	 * @param price_max 상품 최고가격
	 * @param publish_date 상품 올린 날짜
	 * @param maker 상품 만든 곳
	 * @param brand 상품 제조사
	 * @param imgurl 상품 이미지 경로
	 * @param recommend 상품 추천 수 
	 * @param is_open 상품 존재 여부(Y/N)
	 * @param c2_seq 상위 카테고리2 분류
	 * @return int seq
	 */
	public int add(String docid, String title, String description, int price_min, int price_max, String publish_date,
			String maker, String brand, String imgurl, int recommend, String is_open, int c2_seq){
		logger.debug("=========method start >> PruductAdd");
		logger.debug("[PARAMS] docid = " + docid);
		logger.debug("[PARAMS] title = " + title);
		logger.debug("[PARAMS] description = " + description);
		logger.debug("[PARAMS] price_min = " + price_min);
		logger.debug("[PARAMS] price_max = " + price_max);
		logger.debug("[PARAMS] publish_date = " + publish_date);
		logger.debug("[PARAMS] maker = " + maker);
		logger.debug("[PARAMS] brand = " + brand);
		logger.debug("[PARAMS] imgurl = " + imgurl);
		logger.debug("[PARAMS] recommend = " + recommend);
		logger.debug("[PARAMS] is_open = " + is_open);
		logger.debug("[PARAMS] c2_seq = " + c2_seq);
		
		int seq = -1;

		// SQL 인젝션 방어
		docid = docid.replace("'", "\'");
		title = title.replace("'", "\'");
		description = description.replace("'", "\'");
		publish_date = publish_date.replace("'", "\'");
		maker = maker.replace("'", "\'");
		brand = brand.replace("'", "\'");
		imgurl = imgurl.replace("'", "\'");
		is_open = is_open.replace("'", "\'");

		// -----------------------------------------
		// 로직 구현
		// -----------------------------------------
		// 테이블이 자동 증가가 아니므로,
		// 최대값 + 1 형식으로 메서드 안에서 생성한다.
		int ProductSeq = db.getMax(TABLE, "seq", null) + 1;

		logger.debug("자동 생성된 상품 번호 : " + ProductSeq);

		// 트랜젝션에 대한 판단이 잘 서지 않는다면, 무조건 하면 된다.
		db.beginTrans();

		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO product("
				+ "seq, docid, title, description, price_min, price_max, publish_date, maker, brand, imgurl, recommend, is_open, category2_seq, reg_date,edit_date"
				+ ") VALUES (" 
				+ "%d, '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', %d, '%s', %d, '%s','%s')";

		boolean result = db.execSql(sql, ProductSeq, docid, title, description, price_min,
				price_max, publish_date, maker, brand, imgurl, recommend, is_open,c2_seq, datetime, datetime);

		// -----------------------------------------
		// 결과처리
		// -----------------------------------------
		if (result) {
			seq = ProductSeq;
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 상품 등록 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 데이터 추가 실패");
		}

		logger.debug("=========method end >> PruductAdd");
		return seq;
	}
	
	/**
	 * 상품을 수정하는 메서드
	 * @param seq 상품 seq
	 * @param docid 상품코드
	 * @param title 상품 이름
	 * @param description 상품 정보
	 * @param price_min 상품 최저가격
	 * @param price_max 상품 최고가격
	 * @param publish_date 상품 올린 날짜
	 * @param maker 상품 만든 곳
	 * @param brand 상품 제조사
	 * @param imgurl 상품 이미지 경로
	 * @param recommend 상품 추천 수 
	 * @param is_open 상품 존재 여부(Y/N)
	 * @param c2_seq 상위 카테고리2 분류
	 * @return boolean result 수정됐는지 여부
	 */
	public boolean edit(int seq, String docid, String title, String description, int price_min, int price_max, String publish_date,
			String maker, String brand, String imgurl, int recommend, String is_open, int c2_seq){
		logger.debug("=========method start >> Pruductedit");
		logger.debug("[PARAMS] seq = " + seq);
		logger.debug("[PARAMS] docid = " + docid);
		logger.debug("[PARAMS] title = " + title);
		logger.debug("[PARAMS] description = " + description);
		logger.debug("[PARAMS] price_min = " + price_min);
		logger.debug("[PARAMS] price_max = " + price_max);
		logger.debug("[PARAMS] publish_date = " + publish_date);
		logger.debug("[PARAMS] maker = " + maker);
		logger.debug("[PARAMS] brand = " + brand);
		logger.debug("[PARAMS] imgurl = " + imgurl);
		logger.debug("[PARAMS] recommend = " + recommend);
		logger.debug("[PARAMS] is_open = " + is_open);
		logger.debug("[PARAMS] c2_seq = " + c2_seq);

		// SQL 인젝션 방어
		docid = docid.replace("'", "\'");
		title = title.replace("'", "\'");
		description = description.replace("'", "\'");
		publish_date = publish_date.replace("'", "\'");
		maker = maker.replace("'", "\'");
		brand = brand.replace("'", "\'");
		imgurl = imgurl.replace("'", "\'");
		is_open = is_open.replace("'", "\'");

		boolean result = false;

		db.beginTrans();

		String sql = "UPDATE product SET docid = '%s', title = '%s', description = '%s', price_min = %d, price_max = %d, publish_date ='%s', maker = '%s', brand = '%s', imgurl = '%s', recommend = %d, is_open = '%s', category2_seq = %d, reg_date = '%s' WHERE seq = %d;";
		logger.debug("[PARAMS] sql = " + sql);
		result = db.execSql(sql, docid, title, description, price_min,
				price_max, publish_date, maker, brand, imgurl, recommend, is_open,c2_seq, datetime, seq);

		if (result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + "번 상품 수정성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 데이터 수정 실패 ");
		}
	
		logger.debug("=========method end >> Pruductedit");
		return result;
	}
	
	public boolean ProductRecommend(int seq){
		logger.debug("=========method start >> ProductRecommend");
		logger.debug("=========seq >>" + seq);
		boolean result = false;
		
		String sql = "update product set recommend = recommend + 1 where seq = %d";
		
		result = db.execSql(sql, seq);
		
		if (result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + " 번호 상품 추천 성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 상품 추천 실패 ");
		}
		
		logger.debug("=========method end >> ProductRecommend");
		
		return result;
	}
	
	/**
	 * 상품을 보여주는 메서드
	 * @param seq 상품 번호
	 * @return ProductItem item
	 */
	public ProductAllItem show(int seq){
		logger.debug("=========method start >> Pruductshow");
		logger.debug("[PARAMS] seq = " + seq);
		ProductAllItem item = null;
		
		// 데이터 조회
		String sql = "SELECT\n" +
				"	p.seq,\n" +
				"	c1.c1_name,\n" +
				"	c2.c2_name,\n" +
				"	p.docid,\n" +
				"	p.title,\n" +
				"	p.description,\n" +
				"	p.price_min,\n" +
				"	p.price_max,\n" +
				"	p.publish_date,\n" +
				"	p.maker,\n" +
				"	p.brand,\n" +
				"	p.imgurl,\n" +
				"	p.recommend,\n" +
				"	p.is_open,\n" +
				"	p.reg_date,\n" +
				"	p.edit_date,\n" +
				"	c1.seq,\n" +
				"	c2.seq\n" +
				"FROM\n" +
				"	category1 c1\n" +
				"INNER JOIN category2 c2 ON c1.seq = c2.category1_seq\n" +
				"INNER JOIN product p ON c2.seq = p.category2_seq\n" +
				"WHERE\n" +
				"	p.seq = %d";
		ResultSet rs = db.getResult(sql, seq);
		
		logger.debug("[PARAMS] after rs = " + rs);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();
				
				// 1) ResultSet의 모든 데이터를 변수로 추출
				int pno = rs.getInt(1);
				String c1_name = rs.getString(2);
				String c2_name = rs.getString(3);
				String docid1 = rs.getString(4);
				String title = rs.getString(5);
				String decription = rs.getString(6);
				int price_min = rs.getInt(7);
				int price_max = rs.getInt(8);
				String publish_date = rs.getString(9);
				String maker = rs.getString(10);
				String brand = rs.getString(11);
				String imgurl = rs.getString(12);
				int recommend = rs.getInt(13);
				String is_open = rs.getString(14);
				String reg_date = rs.getString(15);
				String edit_date = rs.getString(16);
				int c1_seq = rs.getInt(17);
				int c2_seq = rs.getInt(18);
				
				logger.debug("[PARAMS] after pno = " + pno);
				logger.debug("[PARAMS] c1_name = " + c1_name);
				logger.debug("[PARAMS] c2_name = " + c2_name);
				logger.debug("[PARAMS] docid = " + docid1);
				logger.debug("[PARAMS] title = " + title);
				logger.debug("[PARAMS] description = " + decription);
				logger.debug("[PARAMS] price_min = " + price_min);
				logger.debug("[PARAMS] price_max = " + price_max);
				logger.debug("[PARAMS] publish_date = " + publish_date);
				logger.debug("[PARAMS] maker = " + maker);
				logger.debug("[PARAMS] brand = " + brand);
				logger.debug("[PARAMS] imgurl = " + imgurl);
				logger.debug("[PARAMS] recommend = " + recommend);
				logger.debug("[PARAMS] is_open = " + is_open);
				logger.debug("[PARAMS] reg_date = " + reg_date);
				logger.debug("[PARAMS] edit_date = " + edit_date);
				logger.debug("[PARAMS] c1_seq = " + c1_seq);
				logger.debug("[PARAMS] c2_seq = " + c2_seq);

				// 2) 추출된 값을 객체로 구성
				item = new ProductAllItem(pno, c1_name, c2_name, docid1, title, decription, price_min, price_max, publish_date, maker, brand, imgurl, recommend, is_open, reg_date, edit_date,c1_seq,c2_seq);
				
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(item == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}
		
		logger.debug("=========method end >> Pruductshow");
		return item;
	}
	

	/**
	 * 상품 검색하는 메서드
	 * @param docid 상품 코드
	 * @param order 상품 연관 코드
	 * @return ProductItem
	 */
	public ProductItem search(String docid, String order){
		logger.debug("=========method start >> Pruductsearch");
		logger.debug("[PARAMS] docid = " + docid);
		logger.debug("[PARAMS] order = " + order);
		ProductItem item = null;
		
		// 데이터 조회
		String sql = "SELECT\n" +
				"	p.seq,\n" +
				"	c1.c1_name,\n" +
				"	c2.c2_name,\n" +
				"	p.docid,\n" +
				"	p.title,\n" +
				"	p.description,\n" +
				"	p.price_min,\n" +
				"	p.price_max,\n" +
				"	p.publish_date,\n" +
				"	p.maker,\n" +
				"	p.brand,\n" +
				"	p.imgurl,\n" +
				"	p.recommend,\n" +
				"	p.is_open,\n" +
				"	p.req_date,\n" +
				"	p.edit_date\n" +
				"FROM\n" +
				"	category1 c1\n" +
				"INNER JOIN category2 c2 ON c1.seq = c2.category1_seq\n" +
				"INNER JOIN product p ON c2.seq = p.category2_seq\n" +
				"WHERE\n" +
				"	p.docid = '%s'";
		ResultSet rs = db.getResult(sql, docid);

		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();

				// 1) ResultSet의 모든 데이터를 변수로 추출
				int pno = rs.getInt(1);
				String c1_name = rs.getString(2);
				String c2_name = rs.getString(3);
				String docid1 = rs.getString(4);
				String title = rs.getString(5);
				String decription = rs.getString(6);
				int price_min = rs.getInt(7);
				int price_max = rs.getInt(8);
				String publish_date = rs.getString(9);
				String maker = rs.getString(10);
				String brand = rs.getString(11);
				String imgurl = rs.getString(12);
				int recommend = rs.getInt(13);
				String is_open = rs.getString(14);
				String reg_date = rs.getString(15);
				String edit_date = rs.getString(16);

				// 2) 추출된 값을 객체로 구성
				item = new ProductItem(pno, c1_name, c2_name, docid1, title,
						decription, price_min, price_max, publish_date, maker,
						brand, imgurl, recommend, is_open, reg_date, edit_date);

			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}

		if (item == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}
		
		logger.debug("=========method end >> Pruductsearch");
		return item;
	}
	
	/**
	 * 파서한 상품 검색하는 메서드
	 * @param docid 상품 코드
	 * @param order 상품 연관 코드
	 * @return ProductItem
	 */
	public ProductItem searchParser(String docid){
		logger.debug("=========method start >> Pruductsearch");
		logger.debug("[PARAMS] docid = " + docid);;
		ProductItem item = null;
		
		/** 통신처리 */
		// 접속할 주소
		String url = "http://apis.daum.net/shopping/detail?docid="+docid+"&apikey=e72c6945abe2b00054a617999f2045524d8dd8f1";


		/************ XML 데이터 처리 시작 *************/

		// XML 파서 객체 -< 얘가 주인공
		XmlPullParser parser = null;

		// 객체 생성
		try {
			parser = XmlParser.getParser(url, "UTF-8");
			/**
			 * 읽은 내용(InputStream)을 parser에게 전달 파일의 인코딩 타입을 지정해 주어야 함
			 */
			//parser.setInput(is, "UTF-8");

			// 읽은 태크의 이름
			String tag = null;

			/** 읽은 내용을 담기 위한 변수 */
			int pno = 0;
			String c1_name = null;
			String c2_name = null;
			String docid1 = null;
			String title = null;
			String decription = null;
			int price_min = 0;
			int price_max = 0;
			String publish_date = null;
			String maker = null;
			String brand = null;
			String imgurl = null;
			int recommend = 0;
			String is_open = null;
			String reg_date = null;
			String edit_date = null;
			String category_name = "";

			// 일고 잇는 태그의 종류(문서의 시작, 문서의 끝, 시작태크, 끝태크)
			int type = parser.getEventType();

			// 파싱 처리를 위한 반복 시작
			while (type != XmlPullParser.END_DOCUMENT) {

				// 읽은 태그의 이름
				tag = parser.getName();

				// 현재 읽고 있는 태그의 종류별로 분기
				switch (type) {
				case XmlPullParser.START_TAG:
					/** 원하는 종류의 시작태그를 만났을 때, 값을 추출 */
					if (tag.equals("docid")) {
						parser.next();
						docid1 = parser.getText();
					} else if (tag.equals("title")) {
						parser.next();
						title = parser.getText();
					} else if (tag.equals("description")) {
						parser.next();
						decription = parser.getText();
					} else if (tag.equals("price_min")) {
						parser.next();
						price_min = Integer.parseInt(parser.getText());
					} else if (tag.equals("price_max")) {
						parser.next();
						price_max = Integer.parseInt(parser.getText());
						// HTML 태그 제거
						//description = Util.removeTag(description);
					} else if (tag.equals("maker")) {
						parser.next();
						maker = parser.getText();
					}
					 else if (tag.equals("publish_date")) {
							parser.next();
							publish_date = parser.getText();
						}
					 else if (tag.equals("brand")) {
							parser.next();
							brand = parser.getText();
						}
					 else if (tag.equals("category_name")) {
							parser.next();
							category_name = parser.getText();
						}
					
					 else if (tag.equals("image_url")) {
							parser.next();
							imgurl = parser.getText();
						}
					 else if (tag.equals("recommend")) {
							parser.next();
							recommend = Integer.parseInt(parser.getText());
						}
					 else if (tag.equals("reg_date")) {
							parser.next();
							reg_date = parser.getText();
						}
					 else if (tag.equals("edit_date")) {
							parser.next();
							edit_date = parser.getText();
						}
					
					if(!category_name.equals("")){
						int s = category_name.indexOf(">");
						String ca_2 = category_name.substring(s+1, category_name.length());
						int s2 = ca_2.indexOf(">");
						c1_name = category_name.substring(0, s);
						if(s2 != 0){
							c2_name = ca_2.substring(0,s2);
						}
					}
					 
					break;
				case XmlPullParser.END_TAG:

					/**
					 * 데이터의 단위를 표현하는 태그가 종료되었을 때, 
					 * 추측된 데이터를 하나로 모아서 객체로 변환
					 */
					if (tag.equals("item")) {
						// 하나의 정보를 담은 객체를 직접 생성
						item = new ProductItem(pno, c1_name, c2_name, docid1, title, decription, price_min, price_max, publish_date, maker, brand, imgurl, recommend, is_open, reg_date, edit_date);
					}

					break;
				}

				// 다음 태그로 이동하고, 상태값을 변경
				type = parser.next();

			}
		} catch (XmlPullParserException e) {
			System.out.println("파서 생성 실패 >> " + e.toString());
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("파서 읽기 실패 >> " + e.toString());
			e.printStackTrace();
		}

		return item;
	}
	
	/**
	 * 연관 상품 검색하는 메서드
	 * @param docid 상품 코드
	 * @param order 상품 연관 코드
	 * @return ArrayList<ProductItem>
	 */
	public ArrayList<ProductItem> srarchRel(String docid, String order){
		logger.debug("=========method start >> PruductsrarchRel");
		logger.debug("[PARAMS] docid = " + docid);
		logger.debug("[PARAMS] order = " + order);
		ArrayList<ProductItem> list = null;
		
		// 데이터 조회
		String sql = "SELECT\n" +
				"	p.seq,\n" +
				"	c1.c1_name,\n" +
				"	c2.c2_name,\n" +
				"	p.docid,\n" +
				"	p.title,\n" +
				"	p.description,\n" +
				"	p.price_min,\n" +
				"	p.price_max,\n" +
				"	p.publish_date,\n" +
				"	p.maker,\n" +
				"	p.brand,\n" +
				"	p.imgurl,\n" +
				"	p.recommend,\n" +
				"	p.is_open,\n" +
				"	p.req_date,\n" +
				"	p.edit_date\n" +
				"FROM\n" +
				"	category1 c1\n" +
				"INNER JOIN category2 c2 ON c1.seq = c2.category1_seq\n" +
				"INNER JOIN product p ON c2.seq = p.category2_seq";
		/*
		 * 파라미터에 따라서 검색조건 지정 
		 * if(p_grade > 0) 
		 * { sql += " WHERE grade='" + p_grade
		 * + "'"; }
		 */

		ResultSet rs = db.getResult(sql);

		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<ProductItem>();

				while (rs.next()) {

					// 1) ResultSet의 모든 데이터를 변수로 추출
					int pno = rs.getInt(1);
					String c1_name = rs.getString(2);
					String c2_name = rs.getString(3);
					String docid1 = rs.getString(4);
					String title = rs.getString(5);
					String decription = rs.getString(6);
					int price_min = rs.getInt(7);
					int price_max = rs.getInt(8);
					String publish_date = rs.getString(9);
					String maker = rs.getString(10);
					String brand = rs.getString(11);
					String imgurl = rs.getString(12);
					int recommend = rs.getInt(13);
					String is_open = rs.getString(14);
					String reg_date = rs.getString(15);
					String edit_date = rs.getString(16);

					// 2) 추출된 값을 객체로 구성
					ProductItem item = new ProductItem(pno, c1_name, c2_name, docid1, title, decription, price_min, price_max, publish_date, maker, brand, imgurl, recommend, is_open, reg_date, edit_date);

					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}

		if (list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}
		
		logger.debug("=========method end >> PruductsrarchRel");
		return list;
	}
	
	/**
	 * 판매 상품의 존재 여부를 결정하는 메서드
	 * @param docid 상품 코드
	 * @param is_open 상품 존재여부(Y/N)
	 * @return boolean
	 */
	public boolean isOpen(int seq, String is_open){
		logger.debug("=========method start >> PruductisOpen");
		logger.debug("[PARAMS] seq = " + seq);
		logger.debug("[PARAMS] is_open = " + is_open);
		boolean result = false;
		
		// SQL 인젝션 방어
		is_open = is_open.replace("'", "\'");

		db.beginTrans();

		String sql = "UPDATE product SET is_open = '%s' WHERE seq = %d;";

		result = db.execSql(sql, is_open, seq);

		if (result) {
			db.commit();
			logger.debug("처리결과 >> " + seq + " 번호 상품 존재 여부 수정성공");
		} else {
			db.rollback();
			logger.error("처리결과 >> 데이터 수정 실패 ");
		}
		
		logger.debug("=========method end >> PruductisOpen");
		return result;
	}

	public ArrayList<ProductItem> getProductList(String docid) {
		ArrayList<ProductItem> News = null;

		/** 통신처리 */
		// 접속할 주소
		String url = "http://apis.daum.net/shopping/detail?docid="+docid+"&apikey=e72c6945abe2b00054a617999f2045524d8dd8f1";
		// 접속 후 결과를 리턴받기
		//InputStream is = study.top.common.HttpHandler.connect(url, "UTF-8");

		// 결과가 null 이라면 통신에 실패한 상황이므로...
		//if (is == null) {
		//	System.out.println("통신에러 발생함");
		//	return null;
		//}

		/************ XML 데이터 처리 시작 *************/

		// XML 파서 생성기
		//XmlPullParserFactory factory = null;
		// XML 파서 객체 -< 얘가 주인공
		XmlPullParser parser = null;

		// 객체 생성
		try {
			//factory = XmlPullParserFactory.newInstance();
			//parser = factory.newPullParser();
			parser = XmlParser.getParser(url, "UTF-8");
			/**
			 * 읽은 내용(InputStream)을 parser에게 전달 파일의 인코딩 타입을 지정해 주어야 함
			 */
			//parser.setInput(is, "UTF-8");

			// 읽은 태크의 이름
			String tag = null;

			/** 읽은 내용을 담기 위한 변수 */
			int pno = 0;
			String c1_name = null;
			String c2_name = null;
			String docid1 = null;
			String title = null;
			String decription = null;
			int price_min = 0;
			int price_max = 0;
			String publish_date = null;
			String maker = null;
			String brand = null;
			String imgurl = null;
			int recommend = 0;
			String is_open = null;
			String reg_date = null;
			String edit_date = null;
			String category_name = "";
			
			/** 읽은 내용을 담기 위한 리스트 */
			News = new ArrayList<ProductItem>();

			// 일고 잇는 태그의 종류(문서의 시작, 문서의 끝, 시작태크, 끝태크)
			int type = parser.getEventType();

			// 파싱 처리를 위한 반복 시작
			while (type != XmlPullParser.END_DOCUMENT) {

				// 읽은 태그의 이름
				tag = parser.getName();

				// 현재 읽고 있는 태그의 종류별로 분기
				switch (type) {
				case XmlPullParser.START_TAG:
					/** 원하는 종류의 시작태그를 만났을 때, 값을 추출 */
					if (tag.equals("docid")) {
						parser.next();
						docid1 = parser.getText();
					} else if (tag.equals("title")) {
						parser.next();
						title = parser.getText();
					} else if (tag.equals("description")) {
						parser.next();
						decription = parser.getText();
					} else if (tag.equals("price_min")) {
						parser.next();
						price_min = Integer.parseInt(parser.getText());
					} else if (tag.equals("price_max")) {
						parser.next();
						price_max = Integer.parseInt(parser.getText());
						// HTML 태그 제거
						//description = Util.removeTag(description);
					} else if (tag.equals("maker")) {
						parser.next();
						maker = parser.getText();
					}
					 else if (tag.equals("publish_date")) {
							parser.next();
							publish_date = parser.getText();
						}
					 else if (tag.equals("brand")) {
							parser.next();
							brand = parser.getText();
						}
					 else if (tag.equals("category_name")) {
							parser.next();
							category_name = parser.getText();
						}
					
					 else if (tag.equals("image_url")) {
							parser.next();
							imgurl = parser.getText();
						}
					 else if (tag.equals("recommend")) {
							parser.next();
							recommend = Integer.parseInt(parser.getText());
						}
					 else if (tag.equals("reg_date")) {
							parser.next();
							reg_date = parser.getText();
						}
					 else if (tag.equals("edit_date")) {
							parser.next();
							edit_date = parser.getText();
						}
					
					if(!category_name.equals("")){
						int s = category_name.indexOf(">");
						String ca_2 = category_name.substring(s+1, category_name.length());
						int s2 = ca_2.indexOf(">");
						c1_name = category_name.substring(0, s);
						if(s2 != 0){
							c2_name = ca_2.substring(0,s2);
						}
					}
					 
					break;
				case XmlPullParser.END_TAG:

					/**
					 * 데이터의 단위를 표현하는 태그가 종료되었을 때, 
					 * 추측된 데이터를 하나로 모아서 객체로 변환
					 */
					if (tag.equals("item")) {
						// 하나의 정보를 담은 객체를 직접 생성
						ProductItem item = new ProductItem(pno, c1_name, c2_name, docid1, title, decription, price_min, price_max, publish_date, maker, brand, imgurl, recommend, is_open, reg_date, edit_date);
						// 리스트에 추가
						News.add(item);
					}

					break;
				}

				// 다음 태그로 이동하고, 상태값을 변경
				type = parser.next();

			}
		} catch (XmlPullParserException e) {
			System.out.println("파서 생성 실패 >> " + e.toString());
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("파서 읽기 실패 >> " + e.toString());
			e.printStackTrace();
		}

		return News;
	}
	
	/**
	 * 파라미터에 해당하는 상품페이지와 리스트를 보여준다
	 * @param product 상품이름
	 * @param itemNum 보고싶은 상품 갯수
	 * @param page    총 페이지갯수
	 * @param showPage 화면에 보여질 페이지 수
	 * @param pageNumber 페이지 번호
	 * @return
	 */
	public ArrayList<ProductItem> getProductpageList(String product, int itemNum, int page, int showPage, int pageNumber) {
		ArrayList<ProductItem> News = null;
		
		/** 통신처리 */
		// 접속할 주소
		//String url = "http://apis.daum.net/shopping/detail?docid="+docid+"&apikey=e72c6945abe2b00054a617999f2045524d8dd8f1";
		String url = "http://apis.daum.net/shopping/search?q="+ product +"&sort=pop&result=" + itemNum + "&apikey=e72c6945abe2b00054a617999f2045524d8dd8f1";

		/************ XML 데이터 처리 시작 *************/
		XmlPullParser parser = null;

		// 객체 생성
		try {
			parser = XmlParser.getParser(url, "UTF-8");
			/**
			 * 읽은 내용(InputStream)을 parser에게 전달 파일의 인코딩 타입을 지정해 주어야 함
			 */

			// 읽은 태크의 이름
			String tag = null;

			/** 읽은 내용을 담기 위한 변수 */
			int pno = 0;
			String c1_name = null;
			String c2_name = null;
			String docid1 = null;
			String title = null;
			String decription = null;
			int price_min = 0;
			int price_max = 0;
			String publish_date = null;
			String maker = null;
			String brand = null;
			String imgurl = null;
			int recommend = 0;
			String is_open = null;
			String reg_date = null;
			String edit_date = null;
			String category_name = "";
			
			/** 읽은 내용을 담기 위한 리스트 */
			News = new ArrayList<ProductItem>();

			// 일고 잇는 태그의 종류(문서의 시작, 문서의 끝, 시작태크, 끝태크)
			int type = parser.getEventType();

			// 파싱 처리를 위한 반복 시작
			while (type != XmlPullParser.END_DOCUMENT) {

				// 읽은 태그의 이름
				tag = parser.getName();

				// 현재 읽고 있는 태그의 종류별로 분기
				switch (type) {
				case XmlPullParser.START_TAG:
					/** 원하는 종류의 시작태그를 만났을 때, 값을 추출 */
					if (tag.equals("docid")) {
						parser.next();
						docid1 = parser.getText();
					} else if (tag.equals("title")) {
						parser.next();
						title = parser.getText();
					} else if (tag.equals("description")) {
						parser.next();
						decription = parser.getText();
					} else if (tag.equals("price_min")) {
						parser.next();
						price_min = Integer.parseInt(parser.getText());
					} else if (tag.equals("price_max")) {
						parser.next();
						price_max = Integer.parseInt(parser.getText());
						// HTML 태그 제거
						//description = Util.removeTag(description);
					} else if (tag.equals("maker")) {
						parser.next();
						maker = parser.getText();
					}
					 else if (tag.equals("publish_date")) {
							parser.next();
							publish_date = parser.getText();
						}
					 else if (tag.equals("brand")) {
							parser.next();
							brand = parser.getText();
						}
					 else if (tag.equals("category_name")) {
							parser.next();
							category_name = parser.getText();
						}
					
					 else if (tag.equals("image_url")) {
							parser.next();
							imgurl = parser.getText();
						}
					 else if (tag.equals("recommend")) {
							parser.next();
							recommend = Integer.parseInt(parser.getText());
						}
					 else if (tag.equals("reg_date")) {
							parser.next();
							reg_date = parser.getText();
						}
					 else if (tag.equals("edit_date")) {
							parser.next();
							edit_date = parser.getText();
						}
					
					if(!category_name.equals("")){
						int s = category_name.indexOf(">");
						String ca_2 = category_name.substring(s+1, category_name.length());
						int s2 = ca_2.indexOf(">");
						c1_name = category_name.substring(0, s);
						if(s2 != 0){
							c2_name = ca_2.substring(0,s2);
						}
					}
					 
					break;
				case XmlPullParser.END_TAG:

					/**
					 * 데이터의 단위를 표현하는 태그가 종료되었을 때, 
					 * 추측된 데이터를 하나로 모아서 객체로 변환
					 */
					if (tag.equals("item")) {
						// 하나의 정보를 담은 객체를 직접 생성
						ProductItem item = new ProductItem(pno, c1_name, c2_name, docid1, title, decription, price_min, price_max, publish_date, maker, brand, imgurl, recommend, is_open, reg_date, edit_date);
						// 리스트에 추가
						News.add(item);
					}

					break;
				}

				// 다음 태그로 이동하고, 상태값을 변경
				type = parser.next();

			}
		} catch (XmlPullParserException e) {
			System.out.println("파서 생성 실패 >> " + e.toString());
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("파서 읽기 실패 >> " + e.toString());
			e.printStackTrace();
		}
		
		int count = News.size();
		
		logger.debug("상품리스트 사이즈 : " + count);
		
		if(count < 1){
			return null;
		}
		ProductItem News1 = null;
		ArrayList<ProductItem> Newss = null;
		Newss = new ArrayList<ProductItem>();
		
		/** 로직구현 XXXXXXXX
		 * 임시방편으로 새로운 New 연산자를 생성하여 페이지의 보여질 상품의 수 만큼만
		 * 돌면서 저장하여 리턴....*/
		PageHandler p = PageHandler.getInstance(page, count, showPage, pageNumber);
		logger.debug("page 사이즈(실험용) : " + page);
		if(News != null){
			if(page == -1){
				page = 1;
			}
			// 0부터 시작하므로 시작은 startRec메서드를 호출
			// 끝은 보여질 페이지에 페이지번호를 곱하면 됨
			// ex) 10개의 리스트 갯수 중에 5개씩 보여진다면 2페이지로 나눠지는데
			// 	   0~5, 6~10 으로 for문을 돌아야 한다...
			int endPageNumber = showPage * page;
			for(int i = p.getStartRec(); i<endPageNumber; i++){
				if(News.get(i) != null){
					News1 = News.get(i);
					Newss.add(News1);
				}
			}
		}
		
		
		return Newss;
	}
	
	/**
	 * 상품을 보여주는 리스트 메소드
	 * @param product 상품의 이름
	 * @param itemNum 보여질 상품 갯 수
	 * @return
	 */
	public ArrayList<ProductItem> getProductList(String product, int itemNum) {
		ArrayList<ProductItem> News = null;
		
		/** 통신처리 */
		// 접속할 주소
		//String url = "http://apis.daum.net/shopping/detail?docid="+docid+"&apikey=e72c6945abe2b00054a617999f2045524d8dd8f1";
		String url = "http://apis.daum.net/shopping/search?q="+ product +"&sort=pop&result=" + itemNum + "&apikey=e72c6945abe2b00054a617999f2045524d8dd8f1";
		
		// 접속 후 결과를 리턴받기
		//InputStream is = study.top.common.HttpHandler.connect(url, "UTF-8");

		// 결과가 null 이라면 통신에 실패한 상황이므로...
		//if (is == null) {
		//	System.out.println("통신에러 발생함");
		//	return null;
		//}

		/************ XML 데이터 처리 시작 *************/

		// XML 파서 생성기
		//XmlPullParserFactory factory = null;
		// XML 파서 객체 -< 얘가 주인공
		XmlPullParser parser = null;

		// 객체 생성
		try {
			//factory = XmlPullParserFactory.newInstance();
			//parser = factory.newPullParser();
			parser = XmlParser.getParser(url, "UTF-8");
			/**
			 * 읽은 내용(InputStream)을 parser에게 전달 파일의 인코딩 타입을 지정해 주어야 함
			 */
			//parser.setInput(is, "UTF-8");

			// 읽은 태크의 이름
			String tag = null;

			/** 읽은 내용을 담기 위한 변수 */
			int pno = 0;
			String c1_name = null;
			String c2_name = null;
			String docid1 = null;
			String title = null;
			String decription = null;
			int price_min = 0;
			int price_max = 0;
			String publish_date = null;
			String maker = null;
			String brand = null;
			String imgurl = null;
			int recommend = 0;
			String is_open = null;
			String reg_date = null;
			String edit_date = null;
			String category_name = "";
			
			/** 읽은 내용을 담기 위한 리스트 */
			News = new ArrayList<ProductItem>();

			// 일고 잇는 태그의 종류(문서의 시작, 문서의 끝, 시작태크, 끝태크)
			int type = parser.getEventType();

			// 파싱 처리를 위한 반복 시작
			while (type != XmlPullParser.END_DOCUMENT) {

				// 읽은 태그의 이름
				tag = parser.getName();

				// 현재 읽고 있는 태그의 종류별로 분기
				switch (type) {
				case XmlPullParser.START_TAG:
					/** 원하는 종류의 시작태그를 만났을 때, 값을 추출 */
					if (tag.equals("docid")) {
						parser.next();
						docid1 = parser.getText();
					} else if (tag.equals("title")) {
						parser.next();
						title = parser.getText();
					} else if (tag.equals("description")) {
						parser.next();
						decription = parser.getText();
					} else if (tag.equals("price_min")) {
						parser.next();
						price_min = Integer.parseInt(parser.getText());
					} else if (tag.equals("price_max")) {
						parser.next();
						price_max = Integer.parseInt(parser.getText());
						// HTML 태그 제거
						//description = Util.removeTag(description);
					} else if (tag.equals("maker")) {
						parser.next();
						maker = parser.getText();
					}
					 else if (tag.equals("publish_date")) {
							parser.next();
							publish_date = parser.getText();
						}
					 else if (tag.equals("brand")) {
							parser.next();
							brand = parser.getText();
						}
					 else if (tag.equals("category_name")) {
							parser.next();
							category_name = parser.getText();
						}
					
					 else if (tag.equals("image_url")) {
							parser.next();
							imgurl = parser.getText();
						}
					 else if (tag.equals("recommend")) {
							parser.next();
							recommend = Integer.parseInt(parser.getText());
						}
					 else if (tag.equals("reg_date")) {
							parser.next();
							reg_date = parser.getText();
						}
					 else if (tag.equals("edit_date")) {
							parser.next();
							edit_date = parser.getText();
						}
					
					if(!category_name.equals("")){
						int s = category_name.indexOf(">");
						String ca_2 = category_name.substring(s+1, category_name.length());
						int s2 = ca_2.indexOf(">");
						c1_name = category_name.substring(0, s);
						if(s2 != 0){
							c2_name = ca_2.substring(0,s2);
						}
					}
					 
					break;
				case XmlPullParser.END_TAG:

					/**
					 * 데이터의 단위를 표현하는 태그가 종료되었을 때, 
					 * 추측된 데이터를 하나로 모아서 객체로 변환
					 */
					if (tag.equals("item")) {
						// 하나의 정보를 담은 객체를 직접 생성
						ProductItem item = new ProductItem(pno, c1_name, c2_name, docid1, title, decription, price_min, price_max, publish_date, maker, brand, imgurl, recommend, is_open, reg_date, edit_date);
						// 리스트에 추가
						News.add(item);
					}

					break;
				}

				// 다음 태그로 이동하고, 상태값을 변경
				type = parser.next();

			}
		} catch (XmlPullParserException e) {
			System.out.println("파서 생성 실패 >> " + e.toString());
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("파서 읽기 실패 >> " + e.toString());
			e.printStackTrace();
		}

		return News;
	}
	
	/**
	 * 실행될 sql 문을 list에 담아 리스트에 담는 메소드 사용 (X)
	 * @param list
	 * @param sql
	 * @param p
	 * @return
	 */
	public ArrayList<ProductItem> getList(ArrayList<ProductItem> list,String sql,PageHandler p){
		ResultSet rs = db.getResult(sql, p.getStartRec(), p.getPageArticleCount());
		
		if(rs == null){
			return null;
		}
		
		list = new ArrayList<ProductItem>();
		
		try{
			while(rs.next()){
				int pno = rs.getInt(1);
				String c1_name = rs.getString(2);
				String c2_name = rs.getString(3);
				String docid1 = rs.getString(4);
				String title = rs.getString(5);
				String decription = rs.getString(6);
				int price_min = rs.getInt(7);
				int price_max = rs.getInt(8);
				String publish_date = rs.getString(9);
				String maker = rs.getString(10);
				String brand = rs.getString(11);
				String imgurl = rs.getString(12);
				int recommend = rs.getInt(13);
				String is_open = rs.getString(14);
				String reg_date = rs.getString(15);
				String edit_date = rs.getString(16);
				
				ProductItem item = new ProductItem(pno, c1_name, c2_name, docid1, title, decription, price_min, price_max, publish_date, maker, brand, imgurl, recommend, is_open, reg_date, edit_date);
				list.add(item);
			}
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			try{
				rs.close();
			}catch(SQLException e){
				e.printStackTrace();
			}
			rs = null;
		}
		return list;
	}
	
	/**
	 * 페이징 처리 (후에 파라미터가 더 생길 예정)
	 * @param page
	 * @return
	 */
	public ArrayList<ProductItem> list(int page){
		logger.debug("=========method start >> list");
		logger.debug("[PARAMS] page = " + page);
		
		ArrayList<ProductItem> list = null;
		
		String count_table = "(select seq from product where is_open = 'Y') AS tbl";

		//전체 글 갯수 조회
		int count = db.getCount(count_table, "*", null);
		
		if(count < 1){
			return null;
		}
		
		// 페이징 처리 --> 한 페이지에 8개씩, 페이지번호는 5개 출력
		PageHandler p = PageHandler.getInstance(page, count, 9, 5);
		
		// 글 목록 조회
		String sql = "select ";
		sql += "p.seq, ca1.c1_name, ca2.c2_name, p.docid, p.title, p.description, p.price_min, p.price_max, ";
		sql += "p.publish_date, p.maker, p.brand, p.imgurl, p.recommend, p.is_open, ";
		sql += " p.reg_date, p.edit_date ";
		sql += "from product p ";
		sql += "inner join category2 ca2 ";
		sql += "on ca2.seq = p.category2_seq ";
		sql += "inner join category1 ca1 ";
		sql += "on ca1.seq = ca2.category1_seq ";
		sql += "where p.is_open = 'Y' ";
		sql += "group by p.seq ";
		sql += "order by p.seq desc ";
		sql += "limit %d,%d";
		
		list = getList(list, sql, p);
		
		logger.debug("=========method end >> list");
		return list;
	}
	
	/**
	 * 상품을 보여주는 메소드
	 * @param page 상품의 페이지수
	 * @param category1seq 상품 카테고리1 seq
	 * @return
	 */
	public ArrayList<ProductItem> list(int page, int category1seq){
		logger.debug("=========method start >> list");
		logger.debug("[PARAMS] page = " + page);
		
		ArrayList<ProductItem> list = null;
		
		String count_table = "(select p.seq " +
				" from product p"+
				" inner join category2 ca2"+
				" on p.category2_seq = ca2.seq"+
				" inner join category1 ca1"+
				" on  ca2.category1_seq = ca1.seq"+
				" where p.is_open = 'Y' and  ca1.seq = "+category1seq +
				" order by p.seq desc) AS tbl";

		//전체 글 갯수 조회
		int count = db.getCount(count_table, "*", null);
		
		if(count < 1){
			return null;
		}
		
		// 페이징 처리 --> 한 페이지에 8개씩, 페이지번호는 5개 출력
		PageHandler p = PageHandler.getInstance(page, count, 9, 5);
		
		// 글 목록 조회
		String sql = "select ";
		sql += "p.seq, ca1.c1_name, ca2.c2_name, p.docid, p.title, p.description, p.price_min, p.price_max, ";
		sql += "p.publish_date, p.maker, p.brand, p.imgurl, p.recommend, p.is_open, ";
		sql += " p.reg_date, p.edit_date ";
		sql += "from product p ";
		sql += "inner join category2 ca2 ";
		sql += "on ca2.seq = p.category2_seq ";
		sql += "inner join category1 ca1 ";
		sql += "on ca1.seq = ca2.category1_seq ";
		sql += "where p.is_open = 'Y' and ca1.seq =" + category1seq + " ";
		sql += " group by p.seq ";
		sql += "order by p.seq desc ";
		sql += "limit %d,%d";
		
		list = getList(list, sql, p);
		
		logger.debug("=========method end >> list");
		return list;
	}
	
	/**
	 * 상품을 보여주는 리스트 메소드
	 * @param page 상품 페이지 수
	 * @param category1seq 보여질 카테고리1 seq
	 * @param category2seq 보여질 카테고리2 seq
	 * @return
	 */
	public ArrayList<ProductItem> list(int page, int category1seq, int category2seq){
		logger.debug("=========method start >> list");
		logger.debug("[PARAMS] page = " + page);
		
		ArrayList<ProductItem> list = null;
		
		String count_table = "(select p.seq " +
								" from product p"+
								" inner join category2 ca2"+
								" on p.category2_seq = ca2.seq"+
								" inner join category1 ca1"+
								" on  ca2.category1_seq = ca1.seq"+
								" where p.is_open = 'Y' and  ca1.seq = "+category1seq +
													" and  ca2.seq = "+category2seq +
								" order by p.seq desc) AS tbl";

		//전체 글 갯수 조회
		int count = db.getCount(count_table, "*", null);
		
		if(count < 1){
			return null;
		}
		
		// 페이징 처리 --> 한 페이지에 8개씩, 페이지번호는 5개 출력
		PageHandler p = PageHandler.getInstance(page, count, 9, 5);
		
		// 글 목록 조회
		String sql = "select ";
		sql += "p.seq, ca1.c1_name, ca2.c2_name, p.docid, p.title, p.description, p.price_min, p.price_max, ";
		sql += "p.publish_date, p.maker, p.brand, p.imgurl, p.recommend, p.is_open, ";
		sql += " p.reg_date, p.edit_date ";
		sql += "from product p ";
		sql += "inner join category2 ca2 ";
		sql += "on ca2.seq = p.category2_seq ";
		sql += "inner join category1 ca1 ";
		sql += "on ca1.seq = ca2.category1_seq ";
		sql += "where p.is_open = 'Y' and ca1.seq =" + category1seq + " and ca2.seq =" + category2seq + " ";
		sql += "group by p.seq ";
		sql += "order by p.seq desc ";
		sql += "limit %d,%d";
		
		list = getList(list, sql, p);
		
		logger.debug("=========method end >> list");
		return list;
	}
	
	/**
	 * 검색을 통한 상품을 보여주는 메소드
	 * @param keyword 검색할 키워드
	 * @param page 페이지 수
	 * @return
	 */
	public ArrayList<ProductItem> list(String keyword, int page){
		logger.debug("=========method start >> list");
		logger.debug("[PARAMS] page = " + page);
		logger.debug("[PARAMS] keyword = " + keyword);
		
		ArrayList<ProductItem> list = null;
		
		String count_table = "(select seq from product  where is_open = 'Y' and title like '%%"+keyword+"%%') AS tbl";
		
		//전체 글 갯수 조회
		int count = db.getCount(count_table, "*", null);
		
		logger.debug("[PARAMS] getCount = " + count);
		
		if(count < 1){
			return null;
		}
		
		// 페이징 처리 --> 한 페이지에 8개씩, 페이지번호는 5개 출력
		PageHandler p = PageHandler.getInstance(page, count, 9, 5);
		
		// 글 목록 조회
		String sql = "select ";
		sql += "p.seq, ca1.c1_name, ca2.c2_name, p.docid, p.title, p.description, p.price_min, p.price_max, ";
		sql += "p.publish_date, p.maker, p.brand, p.imgurl, p.recommend, p.is_open, ";
		sql += " p.reg_date, p.edit_date ";
		sql += "from product p ";
		sql += "inner join category2 ca2 ";
		sql += "on ca2.seq = p.category2_seq ";
		sql += "inner join category1 ca1 ";
		sql += "on ca1.seq = ca2.category1_seq ";
		sql += "where p.is_open = 'Y' and title like '%%";
		sql += keyword;
		sql += "%%' ";
		sql += "group by p.seq ";
		sql += "order by p.seq desc ";
		sql += "limit %d,%d";
		
		logger.debug("[PARAMS] sql = " + sql);
		logger.debug("[PARAMS] getStartRec = " + p.getStartRec());
		logger.debug("[PARAMS] getPageArticleCount = " + p.getPageArticleCount());
		
		ResultSet rs = db.getResult(sql, p.getStartRec(), p.getPageArticleCount());
		
		if(rs == null){
			return null;
		}
		
		list = new ArrayList<ProductItem>();
		
		try{
			while(rs.next()){
				int pno = rs.getInt(1);
				String c1_name = rs.getString(2);
				String c2_name = rs.getString(3);
				String docid1 = rs.getString(4);
				String title = rs.getString(5);
				String decription = rs.getString(6);
				int price_min = rs.getInt(7);
				int price_max = rs.getInt(8);
				String publish_date = rs.getString(9);
				String maker = rs.getString(10);
				String brand = rs.getString(11);
				String imgurl = rs.getString(12);
				int recommend = rs.getInt(13);
				String is_open = rs.getString(14);
				String reg_date = rs.getString(15);
				String edit_date = rs.getString(16);
				
				ProductItem item = new ProductItem(pno, c1_name, c2_name, docid1, title, decription, price_min, price_max, publish_date, maker, brand, imgurl, recommend, is_open, reg_date, edit_date);
				list.add(item);
			}
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			try{
				rs.close();
			}catch(SQLException e){
				e.printStackTrace();
			}
			rs = null;
		}
		logger.debug("=========method end >> list");
		return list;
	}
	
	/**
	 * 인기도순으로 상품리스트를 보여준다.
	 * @param size 보여질 상품의 갯수
	 * @return ArrayList<ProductItem>
	 */
	public ArrayList<ProductItem> Top3list(int size){
		logger.debug("=========method start >> list");
		
		ArrayList<ProductItem> list = null;

		// 글 목록 조회
		String sql = "select ";
		sql += "p.seq, ca1.c1_name, ca2.c2_name, p.docid, p.title, p.description, p.price_min, p.price_max, ";
		sql += "p.publish_date, p.maker, p.brand, p.imgurl, p.recommend, p.is_open, ";
		sql += " p.reg_date, p.edit_date ";
		sql += "from product p ";
		sql += "inner join category2 ca2 ";
		sql += "on ca2.seq = p.category2_seq ";
		sql += "inner join category1 ca1 ";
		sql += "on ca1.seq = ca2.category1_seq ";
		sql += "where p.is_open = 'Y' ";
		sql += "group by p.seq ";
		sql += "order by p.recommend desc ";
		sql += "limit 1,%d";
		
		ResultSet rs = db.getResult(sql, size);
		
		if(rs == null){
			return null;
		}
		
		list = new ArrayList<ProductItem>();
		
		try{
			while(rs.next()){
				int pno = rs.getInt(1);
				String c1_name = rs.getString(2);
				String c2_name = rs.getString(3);
				String docid1 = rs.getString(4);
				String title = rs.getString(5);
				String decription = rs.getString(6);
				int price_min = rs.getInt(7);
				int price_max = rs.getInt(8);
				String publish_date = rs.getString(9);
				String maker = rs.getString(10);
				String brand = rs.getString(11);
				String imgurl = rs.getString(12);
				int recommend = rs.getInt(13);
				String is_open = rs.getString(14);
				String reg_date = rs.getString(15);
				String edit_date = rs.getString(16);
				
				ProductItem item = new ProductItem(pno, c1_name, c2_name, docid1, title, decription, price_min, price_max, publish_date, maker, brand, imgurl, recommend, is_open, reg_date, edit_date);
				list.add(item);
			}
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			try{
				rs.close();
			}catch(SQLException e){
				e.printStackTrace();
			}
			rs = null;
		}
		logger.debug("=========method end >> list");
		return list;
	}
	
	/**
	 * size 수 만큼 인기도 순으로 상품을 보여준다.
	 * @param size
	 * @return
	 */
	public ArrayList<ProductItem> Top3NewList(int size){
		logger.debug("=========method start >> list");
		
		ArrayList<ProductItem> list = null;

		// 글 목록 조회
		String sql = "select ";
		sql += "p.seq, ca1.c1_name, ca2.c2_name, p.docid, p.title, p.description, p.price_min, p.price_max, ";
		sql += "p.publish_date, p.maker, p.brand, p.imgurl, p.recommend, p.is_open, ";
		sql += " p.reg_date, p.edit_date ";
		sql += "from product p ";
		sql += "inner join category2 ca2 ";
		sql += "on ca2.seq = p.category2_seq ";
		sql += "inner join category1 ca1 ";
		sql += "on ca1.seq = ca2.category1_seq ";
		sql += "where p.is_open = 'Y' ";
		sql += "group by p.seq ";
		sql += "order by p.seq desc ";
		sql += "limit 1,%d";
		
		ResultSet rs = db.getResult(sql, size);
		
		if(rs == null){
			return null;
		}
		
		list = new ArrayList<ProductItem>();
		
		try{
			while(rs.next()){
				int pno = rs.getInt(1);
				String c1_name = rs.getString(2);
				String c2_name = rs.getString(3);
				String docid1 = rs.getString(4);
				String title = rs.getString(5);
				String decription = rs.getString(6);
				int price_min = rs.getInt(7);
				int price_max = rs.getInt(8);
				String publish_date = rs.getString(9);
				String maker = rs.getString(10);
				String brand = rs.getString(11);
				String imgurl = rs.getString(12);
				int recommend = rs.getInt(13);
				String is_open = rs.getString(14);
				String reg_date = rs.getString(15);
				String edit_date = rs.getString(16);
				
				ProductItem item = new ProductItem(pno, c1_name, c2_name, docid1, title, decription, price_min, price_max, publish_date, maker, brand, imgurl, recommend, is_open, reg_date, edit_date);
				list.add(item);
			}
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			try{
				rs.close();
			}catch(SQLException e){
				e.printStackTrace();
			}
			rs = null;
		}
		logger.debug("=========method end >> list");
		return list;
	}
}

